import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { ValidationPipe, VersioningType } from '@nestjs/common';
import * as session from 'express-session';
import { NextFunction } from 'express';
import { NestExpressApplication } from '@nestjs/platform-express';
import { join } from 'path';
import { ResponseInterceptor } from './common/responseInterceptor'
import { ExceptionInterceptor } from './common/exceptionInterceptor';
// import { RoleGuard } from './guard/role/role.guard';

function MiddleWareGlobal( req: Request,_, next: NextFunction ){
  console.log(req.url);
  next()
}

async function bootstrap() {
  const app = await NestFactory.create<NestExpressApplication>(AppModule);

  // 开启请求参数校验
  app.useGlobalPipes(new ValidationPipe({
    // 开启字段白名单验证 可以剔除掉上传对象中的不在DTO中的字段
    whitelist: true,
    // 当不在请求对象中包含不在白名单的字段时拒绝这个请求并提示 与 whitelist 组合使用
    // forbidNonWhitelisted: true
    // 开启DTO转换 使的 请求对象 与 DTO 匹配时的instanceof 为 true
    //  如果@Param('id') id:number transform配置将试图把id转化成number 而不是经由网络后的字符串id
    transform: true,
    transformOptions: {
      // 开启全局隐私转换 可以省略@Type修饰符 隐试指定所有DTO都使用Type修饰符
      enableImplicitConversion: true,
    }
  }));

  // 配置全局守卫
  // app.useGlobalGuards(new RoleGuard())

  // 配置静态资源目录
  app.useStaticAssets(join(__dirname,'images'),{
    prefix: '/images',
  })

  // 注入响应拦截器
  app.useGlobalInterceptors(new ResponseInterceptor())

  // 注入异常拦截器
  app.useGlobalFilters(new ExceptionInterceptor())

  // 开启cors
  app.enableCors()

  // 应用自定义全局中间件
  app.use(MiddleWareGlobal)

  // 开启接口版本控制
  app.enableVersioning({
    type: VersioningType.URI
  })

  // 注入session插件 使用场景：验证码
  app.use(session({
    secret: 'my-salt', // 加盐
    rolling: true, // 每次请求强行设置cookie时 将重置cookie过期时间
    name: "connect.sid", // 生成客户端cookie的名字 默认为 connect.sid
    /**
     * 设置返回到前端key的属性，默认值为 { path:'/',httpOnly:true,secure:false,maxAge:null
     */
    cookie: {
      path:'/',
      httpOnly:true,
      secure:false,
      maxAge:null
    }
  }))

  // 监听接口
  await app.listen(3000);
}
bootstrap();
